package com.huige.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Modifier;

/**
 * @Author 朱志辉
 * @Create 2024/7/14 下午1:25
 * @Version 1.0
 * Description:   定义四个增强方法，获取目标方法的信息和返回值以及异常对象
 * 1.定义方法 - 增强代码
 * 2.使用注解指定对应的位置
 * 3.配置切点表达式选中方法
 * 4.切面和ioc的配置
 * 5.开启aspectj注解支持
 * <p>
 * <p>
 *     TODO：增强方法中获取目标方法信息
 *          1.全部增强方法中，获取目标方法的信息（方法名，参数，访问修饰符，所属类的信息...）
 *              （JoinPoint joinPoint）import org.aspectj.lang.JoinPoint;
 *               joinPoint包含目标方法的信息！
 *          2.返回的结果 - @AfterReturning
 *               （Object result）result接受返回结果
 *                @AfterReturning("execution(* com..impl.*.*(..))",returning = "形参名即可")
 *          3.异常 - @AfterThrowing
 *                （Throwable t） t 接收异常对象
 */
@Aspect
@Component
public class MyAdvice {

    @Before("com.huige.pointcut.MyPointCut.myPc()")
    public void before(JoinPoint joinPoint) {

        //1.获取方法所属的类的信息
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        //2.获取方法名称
        int modifiers = joinPoint.getSignature().getModifiers();
        String string = Modifier.toString(modifiers);
        String name = joinPoint.getSignature().getName();
        //3.获取参数列表
        Object[] args = joinPoint.getArgs();

    }

    @AfterReturning("com.huige.pointcut.MyPointCut.myPc()")
    public void afterRing(JoinPoint joinPoint) {


    }

    @After("com.huige.pointcut.MyPointCut.myPc()")
    public void after(JoinPoint joinPoint) {

    }

    @AfterThrowing("com.huige.pointcut.MyPointCut.myPc()")
    public void afterThrowing(JoinPoint joinPoint) {

    }

}

